package sistemioperativi.es3.rw;
import java.util.concurrent.*;


public class MemoriaCondivisaSem extends MemoriaCondivisa {

	private int numLettori=0;
	private boolean scrittoreInAttesa = false;
	
	private Semaphore mutex = new Semaphore(1);
	private Semaphore scrittura = new Semaphore(0);
	
	private int numScrittori = 0;
	
	public void iniziaLettura() throws InterruptedException {
		
		mutex.acquire();
		numLettori++;
		mutex.release();
	}

	@Override
	public void inizioScrittura() throws InterruptedException {
		mutex.acquire();
		if(numLettori > 0){
			numScrittori++; //informiamo del cambiamento
			mutex.release();
			scrittura.acquire();
			numScrittori--; 		//scrittoreInAttesa = false;
		}
	}

	@Override
	public void fineScrittura() throws InterruptedException {
		
		if(numScrittori>0){
			scrittura.release();
		}else{
			mutex.release();
		}
		
	}

	@Override
	public void inizioLettura() throws InterruptedException {
	
		if(numLettori == 1){
			scrittura.acquire();
		}
		mutex.release();
	}

	@Override
	public void fineLettura() throws InterruptedException {
		
		mutex.acquire();
		numLettori--;
		
		if(numLettori == 0 /*sono l'ultimo lettore*/ && scrittoreInAttesa){
			//risveglio uno scrittore
			
			scrittura.release();
		}else{
			mutex.release();
		}
	}

}
